package com.zwh.se.oop.Interface_abstract;

/**
 * @author zwh
 * 【为什么需要接口?接口和抽象类的区别?】
 * 接口就是比“抽象类”还“抽象”的“抽象类”，可以更加规范的对子类进行约束。全面地专业地实现了：规范和具体实现的分离。
 * 抽象类还提供某些具体实现，接口不提供任何实现，接口中所有方法都是抽象方法。接口是完全面向规范的，规定了一批类具有的公共方法规范。
 * 从接口的实现者角度看，接口定义了可以向外部提供的服务。
 * 从接口的调用者角度看，接口定义了实现者能提供那些服务。
 * 接口是两个模块之间通信的标准，通信的规范。如果能把你要设计的系统之间模块之间的接口定义好，
 * 就相当于完成了系统的设计大纲，剩下的就是添砖加瓦的具体实现了。大家在工作以后，做系统时往往就是使用“面向接口”的思想来设计系统。
 * 【接口的本质探讨】
 * 接口就是规范，定义的是一组规则，体现了现实世界中“如果你是…则必须能…”的思想。如果你是天
 * 使，则必须能飞。如果你是汽车，则必须能跑。如果你好人，则必须干掉坏人；如果你是坏人，则必须欺负好人。
 * 接口的本质是契约，就像我们人间的法律一样。制定好后大家都遵守。
 * OOP中OO的精髓，是对对象的抽象，最能体现这一点的就是接口。为什么我们讨论设计 模式都只针对具
 * 备了抽象能力的语言（比如c++、java、c#等），就是因为设计模式所研究的，实际上就是如何合理的去抽象。
 */
public interface Interface1 {


    //接口中的变量都是静态常量(public static final修饰)
    public static final String NAME = "tom";

    //接口中的方法都是抽象方法
    public void test1();

    //接口定义注意点：接口的方法默认都写上了public和abstract，所以试图替换它们的都将会编译报错，但是default和static是可以使用的
    //这是由于从Java8开始, Java支持在接口中定义有实现的方法
    public default void defaultMethod1() {
        System.out.println("有默认实现的方法, 属于对象");
    }
     /*
        为什么要在接口中加入非抽象方法？
        如果接口中只能定义抽象方法的话，那么我要是新增或者修改接口中的内容，所有实现类都需要重写这个方法，不利于接口的扩展
        而现在的话，如果在接口中加入默认实现的非抽象方法的话，那么其对实现类就不会有太大的影响。且如果实体类希望调用时调用即可。
     */

    static void defaultMethod2() {
        System.out.println("有默认实现的方法, 属于类");
    }
}

